جزوه · فصل دوم · جلسه ۳۰ · مدیریت Jobs و Kill ← بازگشت به فهرست
📘 فصل دوم · جلسه ۳۰ مدیریت Jobs و Kill
📅 تاریخ: چهارشنبه، ۲۱ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat

▍ مقدمه

در لینوکس، شما می‌توانید پردازش‌های در حال اجرا را بین پیش‌زمینه (Foreground) و پس‌زمینه (Background) جابجا کنید. این قابلیت به شما امکان می‌دهد تا چندین کار را همزمان در یک ترمینال مدیریت کنید. در این جلسه با مفاهیم Jobs، Background/Foreground و ابزار kill برای مدیریت و پایان دادن به پردازش‌ها آشنا می‌شویم.

▍ قرار دادن پردازش در پس‌زمینه با &

با قرار دادن علامت & در انتهای یک دستور، آن پردازش در پس‌زمینه (Background) اجرا می‌شود و ترمینال برای اجرای دستورات دیگر آزاد می‌شود.

┌──(ya3in㉿kali)-[~] └─$ sleep 100 & [1] 12345

توضیح: دستور sleep 100 در پس‌زمینه اجرا می‌شود. خروجی [1] 12345 نشان می‌دهد که این پردازش با شماره Job (1) و PID (12345) در پس‌زمینه اجرا می‌شود.

▍ نمایش پردازش‌های پس‌زمینه با jobs

دستور jobs لیست پردازش‌های پس‌زمینه (Jobs) را که در ترمینال جاری راه‌اندازی شده‌اند، نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ jobs [1]+ Running sleep 100 &

توضیح: خروجی نشان می‌دهد که یک Job با شماره [1] در حال اجرا است.

💡 نکته:

خروجی jobs شامل شماره Job (در کروشه)، وضعیت (Running, Stopped, Done) و نام دستور است. علامت + نشان‌دهنده Job پیش‌فرض (آخرین Job) و علامت - نشان‌دهنده Job قبلی است.

▍ آوردن Job به پیش‌زمینه با fg

با دستور fg (مخفف Foreground) می‌توانید یک Job پس‌زمینه را به پیش‌زمینه (Foreground) بیاورید.

┌──(ya3in㉿kali)-[~] └─$ fg 1 sleep 100

توضیح: fg 1 Job شماره ۱ را به پیش‌زمینه می‌آورد. اگر شماره Job را وارد نکنید، آخرین Job (با علامت +) به پیش‌زمینه می‌آید.

▍ متوقف کردن پردازش با Ctrl+Z

با فشار دادن کلیدهای Ctrl + Z، یک پردازش در حال اجرا در پیش‌زمینه متوقف (Suspended) می‌شود و به پس‌زمینه منتقل می‌گردد.

┌──(ya3in㉿kali)-[~] └─$ sleep 100 ^Z [1]+ Stopped sleep 100

توضیح: با فشردن Ctrl+Z، پردازش sleep 100 متوقف (Stopped) شده و به پس‌زمینه منتقل می‌شود.

▍ ادامه پردازش متوقف‌شده با bg

با دستور bg (مخفف Background) می‌توانید یک Job متوقف‌شده را در پس‌زمینه ادامه دهید.

┌──(ya3in㉿kali)-[~] └─$ bg 1 [1]+ sleep 100 &

توضیح: bg 1 Job شماره ۱ را در پس‌زمینه ادامه می‌دهد. اگر شماره Job را وارد نکنید، آخرین Job متوقف‌شده را ادامه می‌دهد.

✅ جمع‌بندی کنترل Jobs:
  • command & → اجرا در پس‌زمینه
  • jobs → نمایش Jobs
  • fg %N → آوردن Job شماره N به پیش‌زمینه
  • Ctrl+Z → متوقف کردن Job پیش‌زمینه
  • bg %N → ادامه Job متوقف‌شده در پس‌زمینه

▍ فرمان kill و سیگنال‌ها

دستور kill برای ارسال سیگنال به پردازش‌ها استفاده می‌شود. رایج‌ترین کاربرد آن، پایان دادن (Terminate) به یک پردازش با ارسال سیگنال SIGTERM (مقدار ۱۵) است.

┌──(ya3in㉿kali)-[~] └─$ kill 12345

توضیح: این دستور سیگنال SIGTERM (پایان عادی) را به پردازش با PID 12345 ارسال می‌کند.

• سیگنال‌های معروف kill

شما می‌توانید سیگنال مورد نظر را با عدد یا با نام به kill بدهید.

سیگنال مقدار عملکرد توضیح
SIGHUP 1 Term قطع اتصال ترمینال کنترل‌کننده
SIGINT 2 Term وقفه از صفحه کلید (Ctrl+C)
SIGQUIT 3 Core خروج از صفحه کلید (Ctrl+\)
SIGKILL 9 Term کشتن فوری (قابل نادیده‌گیری نیست)
SIGTERM 15 Term پایان عادی (پیش‌فرض kill)
SIGSTOP 17,19,23 Stop متوقف کردن (قابل نادیده‌گیری نیست)
SIGTSTP 18,20,24 Stop توقف از ترمینال (Ctrl+Z)
SIGCONT 19,18,25 Cont ادامه پردازش متوقف‌شده
⚠️ نکته بسیار مهم:

سیگنال‌های SIGKILL (9) و SIGSTOP (17) قابل نادیده‌گیری، مسدودسازی یا گرفتن (catch) نیستند. یعنی با ارسال این سیگنال‌ها، پردازش اجباری پایان می‌یابد یا متوقف می‌شود.

• مثال‌های کاربردی kill

┌──(ya3in㉿kali)-[~] └─$ kill -9 12345

توضیح: ارسال سیگنال SIGKILL (کشتن فوری) به پردازش با PID 12345. این یک روش اجباری برای پایان دادن به پردازش است.

┌──(ya3in㉿kali)-[~] └─$ kill -TERM 12345

توضیح: معادل kill -15 یا kill 12345 است. سیگنال SIGTERM را ارسال می‌کند.

┌──(ya3in㉿kali)-[~] └─$ kill -9 -1

توضیح: kill -9 -1 سیگنال SIGKILL را به همه پردازش‌هایی که شما اجازه کشتن آنها را دارید، ارسال می‌کند. این دستور بسیار خطرناک است و می‌تواند سیستم را از کار بیندازد!

💡 نکته:

برای مشاهده لیست کامل سیگنال‌ها در سیستم خود، از دستور kill -l استفاده کنید.

┌──(ya3in㉿kali)-[~] └─$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...

▍ ترکیب با ps و grep برای پیدا کردن PID

برای پیدا کردن PID یک پردازش و سپس کشتن آن، می‌توانید از ترکیب ps و grep استفاده کنید.

┌──(ya3in㉿kali)-[~] └─$ ps aux | grep firefox user 1200 0.1 0.5 123456 12345 ? S 10:05 0:15 /usr/bin/firefox └─$ kill -9 1200

توضیح: ابتدا PID مرورگر Firefox را پیدا کرده و سپس با kill -9 آن را به‌اجبار می‌بندیم.

▍ جمع‌بندی

✅ تمرین پیشنهادی:
  • یک دستور طولانی مثل sleep 300 را با & در پس‌زمینه اجرا کنید.
  • با jobs آن را ببینید.
  • با fg آن را به پیش‌زمینه بیاورید و سپس با Ctrl+Z متوقف کنید.
  • با bg آن را در پس‌زمینه ادامه دهید.
  • با kill %1 (یا kill با PID) آن را پایان دهید.
  • با ps aux | grep firefox PID مرورگر خود را پیدا کنید و با kill -9 آن را ببندید.